using System;
using System.Configuration;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using SystemFrameworks;
using Anthem;
using BusinessRules;
using Common;
using DataAccess;
using UsrControls;

namespace web.Controls
{
	/// <summary>
	///	Summary description ZonasGeograficas
	/// </summary>
	public class wucZonasGeograficas : UserControl
	{
		protected DropDownBase dlpMunicipios;
		protected DropDownBase dlpDepartamentos;

		#region Controles, Objetos, Constantes

        BasZonasGeograficas objBR = new BasZonasGeograficas(ConfigurationManager.AppSettings["Conn"]);
		BasZonasGeograficasData objData = new BasZonasGeograficasData();			
		protected string mstrClassLabels = "camporequerido";
		protected RequiredFieldValidator reqDepartamento;
		protected RequiredFieldValidator reqMunicipio;
		static Cache _cache = HttpContext.Current.Cache;
		#endregion

		#region Propiedades Publicas
		
		public bool isLoaded{
			set{Session["isLoadedX"] = value;
			}
			get{
				if(Session["isLoadedX"] !=null)
					return (bool)Session["isLoadedX"];
				return false;
			}
		}

		public string DepartamentoSeleccionado
		{
			get{return dlpDepartamentos.SelectedValue;}
			set
			{
				ViewState["DepartamentoSeleccionado"] = value;
			}
		}

		public string NombreDepartamentoSeleccionado
		{
			get{return dlpDepartamentos.SelectedText;}
		}


		public string MunicipioSeleccionado
		{
			get
			{
				if (dlpMunicipios.SelectedValue=="")
				{
					return dlpDepartamentos.SelectedValue;
				}
				return dlpMunicipios.SelectedValue;
			}
			set
			{
				ViewState["MunicipioSeleccionado"] = value;
			}
		}

		public string NombreMunicipioSeleccionado
		{
			get
			{
				return dlpMunicipios.SelectedText;
			}
		}
		
		
		public bool BusquedaMunicipio
		{
			get
			{
				return dlpMunicipios.SearchVisible;
			}
			set
			{
				dlpMunicipios.SearchVisible = value;
			}
		}

		public bool BusquedaDepartamento
		{
			get
			{
				return dlpDepartamentos.SearchVisible;
			}
			set
			{
				dlpDepartamentos.SearchVisible = value;
			}
		}

		public bool Enabled
		{
			set
			{
				dlpDepartamentos.Enabled = value;
				dlpMunicipios.Enabled = value;
				dlpDepartamentos.UpdateAfterCallBack=true;
				dlpMunicipios.UpdateAfterCallBack=true;
			}			
		}

		public string ClassLabels
		{
			set
			{
				mstrClassLabels = value;			
			}			
		}

		public bool DepartamentoObligatorio
		{
			get
			{
				return reqDepartamento.Enabled;
			}
			set
			{
				reqDepartamento.Enabled = value;
			}
		}

		public bool MunicipioObligatorio
		{
			get
			{
				return reqMunicipio.Enabled;
			}
			set
			{
				reqMunicipio.Enabled = value;
			}
		}

		#endregion

		#region Metodos Privados
		private void CargaDpto()
		{
			try
			{
				if (Cache[Utilidad._CACHE_DEPARTAMENTOS] != null)
				{
					objData = (BasZonasGeograficasData)Cache[Utilidad._CACHE_DEPARTAMENTOS];
				}
				else
				{
					objData = objBR.BuscarZonasGeograficas();
				}
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(ex.Message,ex); 
			}
				
			dlpDepartamentos.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

			if (dlpDepartamentos.Count > 0 && ViewState["DepartamentoSeleccionado"]!=null)
			{
				dlpDepartamentos.SelectedValue = ViewState["DepartamentoSeleccionado"].ToString();
			}
			else if (dlpDepartamentos.Count > 0 && ViewState["MunicipioSeleccionado"]!=null)
			{
				ViewState["DepartamentoSeleccionado"] = ViewState["MunicipioSeleccionado"].ToString().Substring(0, 2);
				dlpDepartamentos.SelectedValue =  ViewState["DepartamentoSeleccionado"].ToString();
			}

			if (this.DepartamentoObligatorio)
			{
				dlpDepartamentos.AddItem(Utilidad.SELECCIONE, "", 0);
			}
		}

		private void CargaMunicipio()
		{
			if (dlpDepartamentos.Count > 0)
			{
				try
				{
					objData = CargarMunicipios(dlpDepartamentos.SelectedValue);
				}
				catch (Exception ex)
				{
					throw new ApplicationExceptionManager(ex.Message,ex); 
				}
				dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

				if (ViewState["DepartamentoSeleccionado"]!=null)
				{
					dlpMunicipios.SelectedValue = ViewState["MunicipioSeleccionado"].ToString();
				}
			}
			
			if (this.MunicipioObligatorio)
			{
				dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
			}
		}

		#endregion

		#region Eventos 
		private void Page_Load(object sender, EventArgs e)
		{
			Manager.Register(this);			
			if (!IsPostBack)
			{	
				CargaDpto();
				CargaMunicipio();		
				isLoaded = true;
			}
		}
		private void dlpDepartamentos_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (dlpDepartamentos.Count >0)
			{	
				dlpMunicipios.Enabled = false;
				try
				{
					objData = CargarMunicipios(dlpDepartamentos.SelectedValue);
				}
				catch (Exception ex)
				{
					throw new ApplicationExceptionManager(ex.Message,ex); 
				}
				dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

				dlpMunicipios.Enabled = true;

			}
			
			if (this.MunicipioObligatorio)
			{
				dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
			}

		}
		#endregion


		/// <summary>
		/// consulta los departamentos y los almacena en CACHE
		/// </summary>
		static BasZonasGeograficasData CargarMunicipios(string strIdDepartamento)
		{
			try
			{
				BasZonasGeograficasData zonasGeograficasData = null;

				if (_cache[Utilidad._CACHE_MUNICIPIOS]!=null)
				{
					zonasGeograficasData = (BasZonasGeograficasData)_cache[Utilidad._CACHE_MUNICIPIOS];
					zonasGeograficasData.DefaultView.RowFilter = String.Format("{0}='{1}'", BasZonasGeograficasData.ZON_PADRE_ID_FIELD, strIdDepartamento);
				}

				return zonasGeograficasData;
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(ex.Message, ex);
			}
		}


		
		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			InitializeComponent();
			base.OnInit(e);
		}
		
		private void InitializeComponent()
		{
			this.dlpDepartamentos.SelectedIndexChanged += new System.EventHandler(this.dlpDepartamentos_SelectedIndexChanged);
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion
	
		#region Metodos Publicos
		/// <summary>
		/// Permite asignar Dpto y Municipio
		/// </summary>
		public void AsignarValores(string CodZona)
		{
            if (CodZona != "")
            {
                string strDpto = CodZona.Substring(0, 2);

                this.CargaDpto();

                try
                {
                    //this.CargaDpto();
                    objData = CargarMunicipios(strDpto);
                }
                catch (Exception ex)
                {
                    throw new ApplicationExceptionManager(ex.Message, ex);
                }
                dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD,
                                       BasZonasGeograficasData.ZON_ID_FIELD);

                if (MunicipioObligatorio)
                {
                    dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
                }
                ViewState["DepartamentoSeleccionado"] = strDpto;
                ViewState["MunicipioSeleccionado"] = CodZona;
                dlpDepartamentos.SelectedValue = strDpto;
                dlpMunicipios.SelectedValue = CodZona;
            }

		}

		public void Enable(bool enabled)
		{
			dlpDepartamentos.Enabled = enabled;
			dlpDepartamentos.UpdateAfterCallBack = true;
			dlpMunicipios.Enabled = enabled;
			dlpMunicipios.UpdateAfterCallBack = true;
			reqDepartamento.Enabled = enabled;
			reqDepartamento.UpdateAfterCallBack = true;
			reqMunicipio.Enabled = enabled;
			reqMunicipio.UpdateAfterCallBack = true;

			if (MunicipioObligatorio && !enabled)
			{
				dlpMunicipios.Items.Clear();
				dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
				
			}

		}

		public void cargarDatosZona()
		{
			CargaDpto();
			CargaMunicipio();
		}
		#endregion
	}
}
